/*
 * @(#)XfspDuboisPradeSimilarity.java        2004/08/01
 *
 * This file is part of Xfuzzy 3.1, a design environment for fuzzy logic
 * based systems.
 *
 * (c) 2000 IMSE-CNM. The authors may be contacted by the email address:
 *                    xfuzzy-team@imse.cnm.es
 *
 * Xfuzzy is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by
 * the Free Software Foundation.
 *
 * Xfuzzy is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * for more details.
 */

package xfuzzy.xfsp.model.types;

import xfuzzy.lang.ParamMemFunc;
import xfuzzy.lang.Universe;

/**
 * <p> <b>Descripci�n:</b> contruye un evaluador de la medida de similaridad de
 * las funciones de pertenencia de un tipo seg�n el m�todo de Dubois & Prade.
 * <p> <b>E-mail</b>: <ADDRESS>joragupra@us.es</ADDRRESS>
 * @author Jorge Agudo Praena
 * @version 2.5
 * @see IXfspSimilarity
 *
 */
public class XfspDuboisPradeSimilarity
    implements IXfspSimilarity {

  //universo del tipo cuya similaridad se quiere evaluar
  private Universe u;

  /**
   * <p> <b>Descripci�n:</b> establece el universo del tipo para el que se
   * quiere calcular el grado de similaridad de sus funciones de pertenencia.
   * @param u Universo del tipo para el que se quiere calcular el grado de
   * similaridad de sus funciones de pertenencia.
   *
   */
  public void setUniverse(Universe u) {
    //establece el universo del tipo para el que se quiere calcular el grado de
    //similaridad de sus funciones de pertenencia
    this.u = u;
  }

  /**
   * <p> <b>Descripci�n:</b> permite conocer el grado de similaridad de dos
   * funciones de pertenencia.
   * @param a Primera funci�n de pertenencia.
   * @param b Segunda funci�n de pertenencia cuya similaridad se quiere conocer.
   * @return Grado de similaridad entre las dos funciones de pertenencia.
   *
   */
  public double similarity(ParamMemFunc a, ParamMemFunc b) {
    //acumulador de valores minimos
    double min = 0;
    //acumulador de valores m�ximos
    double max = 0;
    //recorre todos los valores del universo del tipo
    for (int i = 0; i < u.card(); i++) {
      //suma el m�nimo entre el valor de la funci�n de pertenencia a y el valor
      //de la funci�n de pertenencia de la funci�n b en el punto actual al valor
      //que ten�a el acumulador de m�nimos
      min += Math.min(a.compute(u.min() + (i * u.step())),
                      b.compute(u.min() + (i * u.step())));
      //suma el m�ximo entre el valor de la funci�n de pertenencia a y el valor
      //de la funci�n de pertenencia de la funci�n b en el punto actual al valor
      //que ten�a el acumulador de m�ximos
      max += Math.max(a.compute(u.min() + (i * u.step())),
                      b.compute(u.min() + (i * u.step())));
    }
    //devuelve el cociente ente la suma de los m�nimos y la suma de los m�ximos
    return min / max;
  }
}
